#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ls (o<<1)
#define rs (o<<1 | 1)
const int N = 2e5+10;

int n,m;
int a[N], t[N<<2], lz[N<<2];

void update(int s, int e, int o, int x){
    t[o] = (e-s+1) - t[o];
    lz[o] ^= x;
}

void pushup(int o){
    t[o] = t[ls] + t[rs];
}

void pushdown(int s, int e, int o){
    if ( lz[o]==0 ) return;

    int mid = (s+e) / 2;
    update(s,mid,ls,lz[o]);
    update(mid+1,e,rs,lz[o]);

    lz[o] = 0;
}

void build(int s=1, int e=n, int o=1){
    if ( s==e ){
        t[o] = a[s];
        return;
    }

    int mid = (s+e) / 2;
    build(s,mid,ls);
    build(mid+1,e,rs);
    pushup(o);
}

void modify(int l, int r, int x, int s=1, int e=n, int o=1){
    // if ( s==e ){
    //     t[o] = (t[o]+1) % 1;
    //     return;
    // }
    if ( l<=s && e<=r ){
        update(s,e,o,x);
        return;
    }

    pushdown(s,e,o);
    int mid = (s+e) / 2;
    if ( l<=mid ) modify(l,r,x,s,mid,ls);
    if ( mid+1<=r ) modify(l,r,x,mid+1,e,rs);
    pushup(o);
}

int query(int l, int r, int s=1, int e=n, int o=1){
    // if ( s==e ){
    //     return t[o] & 1;
    // }
    if ( l<=s && e<=r ){
        return t[o];
    }

    pushdown(s,e,o);
    int mid = (s+e) / 2;
    int res = 0;
    if ( l<=mid ) res += query(l,r,s,mid,ls);
    if ( mid+1<=r ) res += query(l,r,mid+1,e,rs);
    pushup(o);
    return res;
}

signed main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> m;
    cin.ignore();
    for ( int i=1; i<=n; i++ ) {
        char c; cin >> c;
        a[i] = c - '0';
    }
    build();

    while(m--){
        int op,l,r; cin >> op >> l >> r;
        if ( op==0 ){
            modify(l,r,1);
        } else {
            cout << query(l,r) << '\n'; 
        }
    }
}